
// 实现与MySQL交互
const mysql = require('mysql');
const _conf = require('../config/db');
const _dbUtil = require('../util/db_util');
const _userSql = require('./userSqlMapping');
const _base = require('../util/base');
const _uuidV4 = require('uuid/v4');
const async = require('async');

// 使用连接池，提升性能
const pool = mysql.createPool(_dbUtil.extend({}, _conf.mysql));
const SESSION_ID = 1; //测试使用
const STATUS = 1;
const LOGIN_TYPE = STATUS;

//向前台返回JSON方法的简单封装
const jsonWrite = function (res, ret) {
    if (typeof ret === 'undefined') {
        res.json({
			hasError: true,
			errMsg: '操作失败!'
        });
    } else {
        res.json(ret);
    }
};

module.exports = {
	
    // 登录
    loginByName: function (req, resp, next) {
        pool.getConnection(function (err, connection) {
            if (err) {
                console.error(err);
                return;
            }
            let param = req.body;
            connection.query(_userSql.queryPasswordByName, [
            	param.username
			], function (err, result) {
                if (err) {
                    console.log(err);
                    return;
                }

                if (result.length === 0) {
                    result = {
						hasError: true,
						errMsg : '账号不存在'
                    }
                } else if (result[0].password !== param.password) {
                    result = {
						hasError: true,
						errMsg : '密码不正确'
                    }
                } else {
					let data = result[0];
                    
                    //登录成功,将session设置到作用域中
                    req.session.loginInfo = {
                        loginId : data.user_id,
                        expires : new Date().getTime()
                    };

                    result = {
						user_id : data.user_id,
						username: data.login_name,
						login_type: data.login_type,
						hasError : false,
						errMsg : null
                    };
                }
                // 以json形式，把操作结果返回给前台页面
                jsonWrite(resp, result);

                // 释放连接
                connection.release();
            })
        })
    },
	
	// 查询用户信息
	queryUserInfoById: function (req, resp, next) {
		pool.getConnection(function (err, connection) {
			if (err) {
				console.error(err);
				return;
			}
			let param = req.params;
			console.error(param);
			connection.query(_userSql.queryUserInfoById, [param.id], function (err, result) {
				if (err) {
					console.log(err);
					jsonWrite(resp, {
						hasError: true
					});
					return;
				}
				console.error(result);
				let data = result[0];
				data.user_id = data.user_id.toString();
				data.hasError= false;
				// 以json形式，把操作结果返回给前台页面
				jsonWrite(resp,data);
				
				// 释放连接
				connection.release();
			})
		})
	},
	
	// 检查登录信息
	checkedRegisterInfo: function (req,resp,next) {
		pool.getConnection(function (err, connection) {
			if (err) {
				console.error(err);
				return;
			}
			let param = req.body;
			console.error(param);
			connection.query(_userSql.checkedRegisterInfo, [
				param.username,
				param.nick_name
			], function (err, result) {
				if (err) {
					console.log(err);
					return;
				}
				console.log(result);
				if (result.length === 0) {
					result = {
						hasError: false,
						errMsg : null
					}
				} else {
					
					for(let value of result)
					{
						if(value.login_name === param.username){
							result = {
								hasError: true,
								errMsg : '手机号已注册，请直接登录'
							};
							break;
						}
						if (value.nick_name === param.nick_name) {
							result = {
								hasError: true,
								errMsg : '该昵称已被占用'
							};
							break;
						}
						
					}
					
				}
				// 以json形式，把操作结果返回给前台页面
				jsonWrite(resp, result);
				
				// 释放连接
				connection.release();
			})
		})
	},
	
	// 注册
	register : function (req, resp, next) {
		pool.getConnection(function (err, connection) {
			if (err) {console.log(err);return;}
			
			let param = req.body;
			let nick_name = param.nick_name;
			
			let login_name = param.username;
			let password = param.password;
			
			if(!nick_name || !login_name || !password) return;
			
			let insert_user_id;
			
			let addUser = function (callback) {
				connection.query(_userSql.addUser, [
					nick_name
				], function (err, result) {
					if (err) {
						console.log(err);
						callback(err, null);
						return;
					}
					console.log('第一次插入用户成功!');
					console.error(result);
					insert_user_id = result.insertId;
					callback(null, result);
				});
			};
			let addLogin = function (callback) {
				connection.query(_userSql.addLogin, [
					login_name,password,STATUS,LOGIN_TYPE,insert_user_id
				], function (err, result) {
					if (err) {
						console.log(err);
						callback(err, null);
						return;
					}
					console.log('第二次插入登录成功!');
					callback(null, result);
				});
			};
			async.series([addUser, addLogin], function (err, result) {
				if (err) {
					console.log(err);
					//回滚
					connection.rollback(function () {
						console.log('出现错误,回滚!');
						//释放资源
						connection.release();
					});
					return;
				}
				console.error(result);
				//提交
				connection.commit(function (err) {
					if (err) {
						console.log(err);
						jsonWrite(resp,{
							hasError: true,
							errMsg : '服务器未知错误!'
						});
						return;
					}
					
					console.log('成功,提交!');
					// 以json形式，把操作结果返回给前台页面
					jsonWrite(resp,{
						hasError: false,
						user_id : insert_user_id,
						username: login_name,
						login_type: 'telphone',
						errMsg : null
					});
					//释放资源
					connection.release();
				});
			})
			
		});
	},
	
	//　更新密码
	updateLoginPassword : function (req,resp,next) {
		pool.getConnection(function (err, connection) {
			if (err) {console.log(err);return;}
			
			let param = req.body;
			console.error(param);
			
			let updatePassword = function (callback) {
				connection.query(_userSql.updateLoginPassword, [
					param.password,
					param.username
				], function (err, result) {
					if (err) {
						console.log(err);
						callback(err, null);
						return;
					}
					console.log('更新密码成功!');
					callback(null, result);
				})
			};
			
			let queryUserInfo = function (callback) {
				connection.query(_userSql.queryPasswordByName, [
					param.username
				], function (err, result) {
					if (err) {
						console.log(err);
						callback(err, null);
						return;
					}
					console.log('查询用户信息成功!');
					callback(null, result);
				})
			};
			async.series([updatePassword, queryUserInfo], function (err, result) {
				if (err) {
					console.log(err);
					//回滚
					connection.rollback(function () {
						console.log('出现错误,回滚!');
						//释放资源
						connection.release();
					});
					return;
				}
				//提交
				connection.commit(function (err) {
					if (err) {
						console.log(err);
						jsonWrite(resp, {
							hasError: true,
							errMsg: '服务器未知错误!'
						});
						return;
					}
					
					console.log('成功,提交!');
					// 以json形式，把操作结果返回给前台页面
					
					let data = result[1][0];
					console.error(data);
					
					jsonWrite(resp, {
						hasError: false,
						user_id: data.user_id,
						username: data.login_name,
						login_type: data.login_type,
						errMsg : null
					});
					//释放资源
					connection.release();
				});
			})
		})
	},
	
	// 更新用户信息
	updateUserInfoById: function (req, resp, next) {
        pool.getConnection(function (err, connection) {
			if (err) {console.log(err);return;}
			
			let param = req.body;
			console.error(param);
			if(!param.user_id) return;
            connection.query(_userSql.updateUserInfoById, [
            	param.head_portrait,param.nick_name,param.gender,
				param.birthday,param.address,param.signature,
				param.user_id
			], function (err, result) {
				if (err) {
					param.hasError = true;
					jsonWrite(resp, param);
					return;
				}
				
                if (result) {
					param.hasError = false;
                    jsonWrite(resp, param);
                }
                connection.release();
            })
        });
    },
	
	// 查询粉丝用户和关注用户
	querySuperiorUserAndFansUser : function (req, resp, next) {
		pool.getConnection(function (err, connection) {
			if (err) {
				console.error(err);
				return;
			}
			let param = req.params;
			console.error(param);
			connection.query(_userSql.querySuperiorUserAndFansUser, [
				param.id,param.id
			], function (err, result) {
				if (err) {
					console.log(err);
					jsonWrite(resp, {
						hasError: true
					});
					return;
				}
				let rep_arr=[]; // 重复数组
				for(let i= 0;i< result.length;i++)
				{
					for(let j= 0;j< result.length;j++)
					{
						if( result[i].superior_id === result[j].fans_id && result[i].fans_id == param.id)
						{
							rep_arr.push(result[i]);
						}
					}
				}
				// 关注User,粉丝User,返回数组
				let sup_user= [],fan_user = [],data= {};
				
				function fn (item,followed) {
					let obj= {};
					obj.user_id= item.id;
					obj.head_portrait= item.head_portrait;
					obj.nick_name= item.nick_name;
					obj.gender= item.gender;
					obj.birthday= item.birthday;
					obj.address= item.address;
					obj.signature= item.signature;
					obj.followed = followed;
					return obj;
				}
				
				for(let item of result)
				{
					if(item.superior_id == param.id)
					{
						fan_user.push(fn(item,false));
					}
					if(item.fans_id == param.id)
					{
						sup_user.push(fn(item,true));
					}
				}
				
				for(let rep of rep_arr)
				{
					for(let fan of fan_user)
					{
						if(fan.user_id == rep.id)
						{
							fan.followed = true;
						}
					}
					
				}
				
				data.hasError= false;
				data.user_id= param.id;
				data.superior= sup_user;
				data.fans= fan_user;
				// 以json形式，把操作结果返回给前台页面
				jsonWrite(resp,data);
			})
		})
	},
	
	// 对粉丝增加关注
	addSuperiorByFansId: function (req, resp, next) {
		pool.getConnection(function (err, connection) {
			if (err) {console.log(err);return;}
			
			let param = req.body;
			console.error(param);
			let deleteRelation = function (callback) {
				connection.query(_userSql.deleteAttentionRelation, [
					param.superior_id,param.fans_id
				], function (err, result) {
					if (err) {
						console.log(err);
						callback(err, null);
						return;
					}
					console.log('删除成功!');
					callback(null, result);
				})
			};
			let addSuperior = function (callback) {
				connection.query(_userSql.addSuperiorByFansId, [
					param.superior_id,param.fans_id
				], function (err, result) {
					if (err) {
						console.log(err);
						callback(err, null);
						return;
					}
					console.log('增加关系成功!');
					callback(null, result);
				})
			};
			async.series([deleteRelation, addSuperior], function (err, result) {
				if (err) {
					console.log(err);
					//回滚
					connection.rollback(function () {
						console.log('出现错误,回滚!');
						//释放资源
						connection.release();
					});
					return;
				}
				//提交
				connection.commit(function (err) {
					if (err) {
						console.log(err);
						jsonWrite(resp, {
							hasError: true
						});
						return;
					}
					
					console.log('成功,提交!');
					// 以json形式，把操作结果返回给前台页面
					
					
					jsonWrite(resp, {
						hasError: false,
					});
					//释放资源
					connection.release();
				});
			});
		});
	}
};
